package do

import (
	"bufio"
	"cqTcp/settings"
	"encoding/base64"
	"github.com/fsnotify/fsnotify"
	"go.uber.org/zap"
	"log"
	"net"
	"os"
	"sync"
)

var mutex sync.Mutex

func ListenCodeFile(coon net.Conn, cfg *settings.FilePathConfig) {
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		zap.L().Error("new file watcher failed", zap.Error(err))
	}
	defer func(watcher *fsnotify.Watcher) {
		err := watcher.Close()
		if err != nil {

		}
	}(watcher)

	done := make(chan bool)
	// 添加需要监听的文件详细路径D:\gopro\tcp_test
	filePath := cfg.ReadFileName
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		//如果文件不存在，则创建文件
		file, err := os.Create(filePath)
		if err != nil {
			log.Println("error:", err)
		}
		defer file.Close()
	}
	go func() {
		for {
			select {
			case event, ok := <-watcher.Events:
				if !ok {
					return
				}
				// 检查事件类型、文件名和目标文件名是否匹配
				if event.Op&fsnotify.Write == fsnotify.Write {
					fileInfo, _ := os.Stat(filePath)
					if fileInfo.Size() > 0 {
						// 读取并发送消息
						readAndSend(coon, filePath)
					}
					// fmt.Printf("文件 %s 发生变化： %s \n", event.Name, event.String())
				}
			case err, ok := <-watcher.Errors:
				if !ok {
					return
				}
				log.Println("error:", err)
			}
		}
	}()

	// 监听文件
	err = watcher.Add(filePath)
	if err != nil {
		zap.L().Error(err.Error())
	}
	<-done
}

func readAndSend(coon net.Conn, targetFile string) {
	// 互斥锁保证文件只被一个进程使用
	mutex.Lock()
	defer mutex.Unlock()
	file, err := os.Open(targetFile)
	if err != nil {
		zap.L().Error("Open file failed", zap.Error(err))
		return
	}
	defer file.Close()
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if len(line) != 0 {
			base64Str := base64.StdEncoding.EncodeToString([]byte(line))
			_, err = coon.Write([]byte(base64Str))
			if err != nil {
				zap.L().Error("Write err:", zap.Error(err))
				break
			}
		}
	}
	if err = os.Truncate(targetFile, 0); err != nil {
		zap.L().Info("清空文件失败:", zap.Error(err))
		return
	}
}
